from django.test import TestCase
from django.utils import timezone
from django.urls import reverse

from .models import Question, Choice


def insert_question(text):
    Question.objects.create(question_text=text, pub_date=timezone.now())


class TestQuestionModel(TestCase):

    def test_no_questions(self):
        # 一开始，测试数据库是空的，没有任何Question记录
        r = self.client.get(reverse('polls:index'))
        self.assertContains(r, "No polls are available.")
        self.assertQuerysetEqual(r.context['questions'], [])

    def test_one_question(self):
        # 一开始，测试数据库是空的，没有任何Question记录
        question_text = 'testing12'
        insert_question(question_text)
        r = self.client.get(reverse('polls:index'))
        # assertQuerysetEqual对比两组数据里面的元素是否全部相同，
        # 对比的时候，左边的数据就是来自数据库中的数据，也就是说是
        # 模型的实例对象（不是简单的字符串），右边的数据通常是字符串，
        # 那么，实例对象如何与字符串做对比呢？
        # 默认情况下，使用内置函数repr应用于每一个用来比较的实例对象，
        # 把所返回的结果用来做对比，因此以下代码用法就要求模型的类中要定义：
        # 适当的__repr__函数。
        #
        #   self.assertQuerysetEqual(r.context['questions'], [question_text])
        #
        # 如果模型的类中并没有定义__repr__ 函数，则可以为transform参数指定
        # 一个自定义的转换函数，范例：
        #
        #   t = lambda x: x.question_text
        #   self.assertQuerysetEqual(r.context['questions'], [question_text], t)
        #
        t = lambda x: x.question_text
        self.assertQuerysetEqual(r.context['questions'], [question_text], t)
